package model

import (
	"go.mongodb.org/mongo-driver/bson/primitive"
)

const (
	BackRole string = "BACK_ROLE" // 后台角色
	AppRole  string = "APP_ROLE"  // 应用角色：1.应用管理员，2.成员，3.只读（默认的 3 个角色）
)

// 角色
type Role struct {
	Id        primitive.ObjectID `json:"id" bson:"ID"`
	RoleName  string             `json:"roleName" bson:"Name"` // 用户名称，中文
	ParentId  string             `json:"parentId,omitempty" bson:"parentId,omitempty"`
	Sort      *int               `json:"sort,omitempty" bson:"sort,omitempty"`           // 排序
	RoleAlias string             `json:"roleAlias,omitempty" bson:"roleAlias,omitempty"` // 用户名称，英文
	Desc      string             `json:"desc" bson:"desc"`                               // 角色描述
	IsInitial bool               `json:"isInitial" bson:"isInitial"`                     // 是否是初始化的管理员角色

	TenantModel `json:",inline" bson:",inline"`

	Type       string `json:"type" bson:"type"`             // 角色类型：后台角色, 应用角色
	VisualId   string `json:"visualId" bson:"visualId"`     // 应用id，角色为应用角色时使用
	VisualType string `json:"visualType" bson:"visualType"` //角色当前所处类别

	Users       []*SimpleUser `json:"users,omitempty" bson:"-"` // 拥有该角色的用户
	UserSize    int64         `json:"userSize" bson:"userSize"` // 用户人数
	Authorities []string      `json:"authorities" bson:"-"`     // 后台角色拥有的后台权限

	UserIds  []string `json:"userIds" bson:"-"`  // 角色下的用户
	AppAuths []string `json:"appAuths" bson:"-"` // 应用角色下的应用权限

	// 表单权限
	FormAuths map[string][]string `json:"formAuths" bson:"-"`
	// 表单权限, 0:分发所有表单，1:分发指定表单
	FormAuthType *int `json:"formAuthType" bson:"formAuthType"`
}

// 角色下的用户列表
type SimpleUser struct {
	UserId   primitive.ObjectID `json:"userId" bson:"ID"`     // 用户id
	Avatar   string             `json:"avatar" bson:"avatar"` // 头像
	NickName string             `json:"nickName" bson:"Name"` // 用户昵称
	IsOwner  bool               `json:"isOwner" bson:"-"`     // 是否是拥有者
}

// 给前端的角色
type RoleToWeb struct {
	Id       primitive.ObjectID `json:"id" bson:"ID"`
	RoleName string             `json:"roleName" bson:"Name"`    // 用户名称，中文
	RoleId   string             `json:"roleId" bson:"roleAlias"` // 用户id，英文
	Children []*RoleToWeb       `json:"children"`
}

type Auths struct {
	ApiAuths  []string `json:"apiAuths" bson:"-"`
	MenuAuths []string `json:"menuAuths" bson:"-"`
}

func (auths *Auths) GetCombinedAuth(roleId primitive.ObjectID) []interface{} {
	var doc []interface{}
	if auths.ApiAuths != nil && len(auths.ApiAuths) > 0 {
		for i := range auths.ApiAuths {
			doc = append(doc, &RoleAuthority{
				RoleId:        roleId.Hex(),
				AuthorityName: auths.ApiAuths[i],
				Type:          "API",
			})
		}
	}
	if auths.MenuAuths != nil && len(auths.MenuAuths) > 0 {
		for i := range auths.MenuAuths {
			doc = append(doc, &RoleAuthority{
				RoleId:        roleId.Hex(),
				AuthorityName: auths.MenuAuths[i],
				Type:          "MENU",
			})
		}
	}
	return doc
}

func (r *Role) GetId() string {
	return r.Id.Hex()
}

func (r *Role) SetId(id primitive.ObjectID) {
	r.Id = id
}

type Roles []*Role

type RolesToWeb []*RoleToWeb

// 是否包含某个角色
func (r *Roles) Contain(roleAlias string) bool {
	for _, role := range *r {
		if role.RoleAlias == roleAlias {
			return true
		}
	}
	return false
}
